package api

import (
	"strconv"

	"web/models"
	"web/pkg/app"
	"web/pkg/e"
	"web/service/tag"

	"github.com/gin-gonic/gin"
)

// TagController 标签控制器
type TagController struct {
}

// NewTagController 创建标签控制器实例
func NewTagController() *TagController {
	return &TagController{}
}

// GetTag 获取单个标签
// @Summary 获取单个标签
// @Description 根据ID获取标签详情
// @Tags 标签
// @Accept json
// @Produce json
// @Param id path int true "标签ID"
// @Success 200 {object} app.Response
// @Failure 400 {object} app.Response
// @Router /api/v1/tags/{id} [get]
func (tc *TagController) GetTag(c *gin.Context) {
	id, err := strconv.Atoi(c.Param("id"))
	if err != nil {
		app.Fail(c, e.INVALID_PARAMS, err)
		return
	}

	tagService := tag.NewTag()
	tag, err := tagService.Get(uint(id))
	if err != nil {
		app.Fail(c, e.ERROR, err)
		return
	}

	app.Success(c, tag)
}

// GetTags 获取标签列表
// @Summary 获取标签列表
// @Description 获取所有标签列表
// @Tags 标签
// @Accept json
// @Produce json
// @Success 200 {object} app.Response
// @Router /api/v1/tags [get]
func (tc *TagController) GetTags(c *gin.Context) {
	tagService := tag.NewTag()
	tags, err := tagService.Gets()
	if err != nil {
		app.Fail(c, e.ERROR, err)
		return
	}

	app.Success(c, tags)
}

// CreateTag 创建标签
// @Summary 创建标签
// @Description 创建新标签
// @Tags 标签
// @Accept json
// @Produce json
// @Param tag body models.Tag true "标签信息"
// @Success 200 {object} app.Response
// @Failure 400 {object} app.Response
// @Router /api/v1/tags [post]
func (tc *TagController) CreateTag(c *gin.Context) {
	var tagReq models.Tag
	err := c.ShouldBindJSON(&tagReq)
	if err != nil {
		app.Fail(c, e.INVALID_PARAMS, err)
		return
	}

	tagService := tag.NewTag()
	// 检查标签名是否已存在
	exists, err := tagService.ExistByName(tagReq.Name)
	if err != nil {
		app.Fail(c, e.ERROR, err)
		return
	}
	if exists {
		app.Fail(c, e.ERROR_EXIST_TAG, nil)
		return
	}

	err = tagService.Create(&tagReq)
	if err != nil {
		app.Fail(c, e.ERROR, err)
		return
	}

	app.Success(c, tagReq)
}

// UpdateTag 更新标签
// @Summary 更新标签
// @Description 更新标签信息
// @Tags 标签
// @Accept json
// @Produce json
// @Param id path int true "标签ID"
// @Param tag body models.Tag true "标签信息"
// @Success 200 {object} app.Response
// @Failure 400 {object} app.Response
// @Router /api/v1/tags/{id} [put]
func (tc *TagController) UpdateTag(c *gin.Context) {
	id, err := strconv.Atoi(c.Param("id"))
	if err != nil {
		app.Fail(c, e.INVALID_PARAMS, err)
		return
	}

	var tagReq models.Tag
	err = c.ShouldBindJSON(&tagReq)
	if err != nil {
		app.Fail(c, e.INVALID_PARAMS, err)
		return
	}

	tagService := tag.NewTag()
	err = tagService.Update(uint(id), &tagReq)
	if err != nil {
		app.Fail(c, e.ERROR, err)
		return
	}

	app.Success(c, nil)
}

// DeleteTag 删除标签
// @Summary 删除标签
// @Description 根据ID删除标签
// @Tags 标签
// @Accept json
// @Produce json
// @Param id path int true "标签ID"
// @Success 200 {object} app.Response
// @Failure 400 {object} app.Response
// @Router /api/v1/tags/{id} [delete]
func (tc *TagController) DeleteTag(c *gin.Context) {
	id, err := strconv.Atoi(c.Param("id"))
	if err != nil {
		app.Fail(c, e.INVALID_PARAMS, err)
		return
	}

	tagService := tag.NewTag()
	err = tagService.Delete(uint(id))
	if err != nil {
		app.Fail(c, e.ERROR, err)
		return
	}

	app.Success(c, nil)
}
